// 封装axios
/*
    1、封装可以简化我们接口调用的代码，可以去掉一些重复的代码
    2、换掉Axios也是比较方便的
*/

import axios from 'axios'
import { CONFIG } from '../config/index.js'
import  router from '../router/index.js'
import { ElMessage } from 'element-plus'
// 添加请求拦截器
axios.interceptors.request.use(function (config){
    // 在发送请求之前做些什么
    console.log("请求拦截器：", config)
    // config.headers.Authoriztion = "yyyyyyyyyyyy"
    // 添加时间戳在请求当中
    if (config.method == "get" ) {
        // 解决缓存
        let timeStamp = (new Date()).getTime()
        console.log("timeStamp:", timeStamp)
        // 有没有params
        if (config.params) {
            //  说明本身是有params配置的
            config.params.timeStamp = timeStamp
        } else {
            config.params = {
                timeStamp: timeStamp
            }
        }
    }
    // 取出token的值
    let TokenValue = ""
    try {
        TokenValue = window.localStorage.getItem(CONFIG.TOKEN_NAME)
    }catch (error){
        TokenValue = ""
    }
    if (TokenValue == "" || TokenValue == null) {
        config.headers[CONFIG.TOKEN_NAME] = ""
    } else {
        config.headers[CONFIG.TOKEN_NAME] = TokenValue
    }
    return config
},function (error){
    // 对请求错误做些什么
    ElMessage({
        message: "请求错误："+ error.message,
        type: 'error',
      })
    return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response){
    // 2xx,范围内的状态码都会触发该函数
    // 对响应数据做些什么
    // 判断响应状态码是否正常
    console.log("response:", response)
    if (response.data.status === 200) {
        return Promise.resolve(response)
    } else if (response.data.Status === 401 ) {
        // 说明我们的token已经失效了
        ElMessage({
            message: response.data.Message,
            type: 'warning',
          })
        // 删除本地token
        window.localStorage.removeItem(CONFIG.TOKEN_NAME)
        window.localStorage.removeItem("menus")
        window.localStorage.removeItem("loginName")
        window.localStorage.removeItem("loginType")
        window.localStorage.removeItem("md5Hash")
        
        // 跳转到登录页面
        // 如何取到当前访问的路径
        router.currentRoute.path != "/login" && router.replace("/login")
        
    }
    return response;
},function (error){
    // 超出 2xx 范围的状态码会触发该函数
    // 对响应错误做点什么
    ElMessage({
        message: "请求错误："+ error.message,
        type: 'error',
      })
    return Promise.reject(error);

});

const request = (url = '', data = {}, method = "get", timeout = 5000) => {
    console.log("使用封装函数去处理请求")
    return new Promise((resolve, reject)=>{
        console.log("使用axios请求接口")
        // GET POST
        const methodLower = method.toLowerCase()
        if (methodLower === 'get') {
            axios({
                method: methodLower,
                params: data,
                timeout: timeout,
                url: url,
            }).then((response)=>{
                // 能够正常拿到数据
                resolve(response)
            }).catch((error)=>{
                reject(error)
            })
        } else if (['post', 'put', 'delete'].includes(methodLower)){
            axios({
                method: methodLower,
                data: data,
                timeout: timeout,
                url: url,
            }).then((response)=>{
                // 能够正常拿到数据
                resolve(response)
            }).catch((error)=>{
                reject(error)
            })
        }

    })
}
export default request